home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / FILER / X-FILES.ZIP / 057 / !X-Files / s / veneer < prev   
Text File  |  1997-01-21  |  5KB  |  160 lines

  1. ; Normal register names
  2.  
  3. r0              RN              0
  4. r1              RN              1
  5. r2              RN              2
  6. r3              RN              3
  7. r4              RN              4
  8. r5              RN              5
  9. r6              RN              6
  10. r7              RN              7
  11. r8              RN              8
  12. r9              RN              9
  13. r10             RN              10
  14. r11             RN              11
  15. r12             RN              12
  16. r13             RN              13
  17. r14             RN              14
  18. r15             RN              15
  19.  
  20. ; Alternate register names
  21.  
  22. a1              RN              0
  23. a2              RN              1
  24. a3              RN              2
  25. a4              RN              3
  26. v1              RN              4
  27. v2              RN              5
  28. v3              RN              6
  29. v4              RN              7
  30. v5              RN              8
  31. v6              RN              9
  32. sl              RN              10
  33. fp              RN              11
  34. ip              RN              12
  35. sp              RN              13
  36. lr              RN              14
  37. pc              RN              15
  38.  
  39. V_bit           *               1 :SHL: 28
  40.  
  41.                 IMPORT          |Image$$RO$$Base|
  42.                 IMPORT          |_Lib$Reloc$Off$DP|
  43.  
  44.                 AREA            Veneer, REL, CODE, READONLY
  45.  
  46.                 EXPORT          ABORT
  47.  
  48. AbortErrMsg     &               0
  49.                 =               "Aborted", 0
  50.                 ALIGN
  51.  
  52. ABORT           LDR             a1, SavedSPaddr
  53.                 DCD             |_Lib$Reloc$Off$DP| + &E24AC000  ; This is equivalent of 'SUB r12, r10, #0' + |_Lib$Reloc$Off$DP|
  54.                 LDR             ip, [ip, #4]
  55.                 ADD             a1, ip, a1
  56.                 LDR             sp, [a1]
  57.                 ADR             a1, AbortErrMsg
  58.                 B               wrapperX
  59.  
  60.                 IMPORT          SavedSP
  61. SavedSPaddr     &               SavedSP
  62.  
  63. ; Call a C function
  64. ;
  65. ; R8  ==> Address of function to call
  66. ; R12 ==>
  67.  
  68. wrapper         STMFD           sp!, {r0-r9, sl, fp, ip, lr}  ; Store the input registers onto the stack
  69.  
  70. ; Ensure SVC mode
  71.  
  72.                 MOV             r5, pc
  73.                 ORR             r4, r5, #3
  74.                 TEQP            r4, #0
  75.                 MOV             r0, r0
  76.                 STMFD           sp!, {r4, r5, lr}
  77.  
  78.                 MOV             sl, sp, LSR #20
  79.                 MOV             sl, sl, LSL #20  ; SP_LWM
  80.                 LDMIA           sl, {v1, v2}    ; save old reloc modifiers over fn call
  81.                 LDR             r12, [r12]      ; private word pointer
  82.                 LDMIB           r12, {fp, r12}  ; new relocation modifiers
  83.                 STMIA           sl, {fp, r12}   ; set by module init
  84.                 MOV             fp, #0          ; halt C backtrace here!
  85.  
  86.                 DCD             |_Lib$Reloc$Off$DP| + &E28AA000  ; This is equivalent of 'ADD r10, r10, #0' + |_Lib$Reloc$Off$DP|
  87.  
  88. ; Save the SP on entry
  89.  
  90.                 DCD             |_Lib$Reloc$Off$DP| + &E24AC000  ; This is equivalent of 'SUB r12, r10, #0' + |_Lib$Reloc$Off$DP|
  91.  
  92.                 LDR             ip, [ip, #4]
  93.                 LDR             a1, SavedSPaddr
  94.                 ADD             a1, ip, a1
  95.                 STR             sp, [a1]
  96.  
  97.                 ADD             a1, sp, #4 * 3         ; Pass a pointer to the structure on the stack
  98.                 MOV             lr, pc
  99.                 MOV             pc, r8
  100.  
  101. wrapperX        DCD             |_Lib$Reloc$Off$DP| + &E24AA000  ; This is equivalent of 'SUB r10, r10, #0' + |_Lib$Reloc$Off$DP|
  102.  
  103.                 STMIA           sl, {v1, v2}    ; restore old reloc modifiers
  104.  
  105.                 LDMFD           sp!, {r4, r5, lr}
  106.                 TEQP            r5, #0
  107.                 MOV             r0, r0
  108.  
  109.                 TEQ             a1, #0
  110.                 STRNE           a1, [sp]
  111.  
  112.  
  113.                 LDMFD           sp!, {r0-r9, sl, fp, ip, lr}  ; Get the stuff off the stack
  114.                 ORRNES          pc, lr, #V_bit
  115.                 BICS            pc, lr, #V_bit
  116.  
  117. ; Veneer generates two labels, for example
  118. ;
  119. ; file          Veneer
  120. ;
  121. ; would create vec_file and xFiles_file 
  122.  
  123.                 MACRO
  124. $label          Veneer
  125.                 EXPORT         entry_$label
  126.                 IMPORT         xFiles_$label
  127.  
  128. entry_$label    STMFD          sp!, {r8-r12, lr}
  129.                 LDR            r8, =xFiles_$label
  130.                 BL             wrapper
  131.                 LDMFD          sp!, {r8-r12, lr}
  132.                 ORRVSS         pc, lr, #V_bit
  133.                 BICS           pc, lr, #V_bit
  134.  
  135.                 LTORG
  136.                 MEND
  137.  
  138. Open            Veneer
  139. GetBytes        Veneer
  140. PutBytes        Veneer
  141. Args            Veneer
  142. Close           Veneer
  143. File            Veneer
  144. Func            Veneer
  145.  
  146. Ticker          Veneer
  147. WriteBehind     Veneer
  148.  
  149.                 IMPORT         FileHook
  150.                 EXPORT         RealFileHook
  151.  
  152. RealFileHook    STMFD          sp!, {r8-r12, lr}
  153.                 LDR            r8, =FileHook
  154.                 BL             wrapper
  155.                 LDMFD          sp!, {r8-r12, lr}
  156.                 ORRVSS         pc, lr, #V_bit
  157.                 BICS           pc, lr, #V_bit
  158.  
  159.                 END
  160.